package com.qinsoft.frame.utils;

import java.beans.PropertyVetoException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.datasource.DataSourceFactory;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/** 
 * C3P0DataSourceFactory类描述：c3p0的数据源工厂
 */
public class C3P0DataSource implements DataSourceFactory
{

    private DataSource dataSource;

    @Override
    public DataSource getDataSource()
    {
        return dataSource;
    }

    @Override
    public void setProperties(Properties props)
    {
        ComboPooledDataSource ds = new ComboPooledDataSource();
        try
        {
            ds.setDriverClass(props.get("driver").toString());
        }
        catch (PropertyVetoException e)
        {
            throw new RuntimeException(e);
        }
        ds.setJdbcUrl(props.get("url").toString());
        ds.setUser(props.get("username").toString());
        ds.setPassword(props.get("password").toString());
        //初始连接数
        if (props.get("InitialPoolSize") != null)
        {
            ds.setInitialPoolSize(Integer.parseInt(props.get("InitialPoolSize").toString()));
        }
        //最大连接数
        if (props.get("MaxPoolSize") != null)
        {
            ds.setMaxPoolSize(Integer.parseInt(props.get("MaxPoolSize").toString()));
        }
        //最小连接数
        ds.setMinPoolSize(3);
        //当连接池中的连接耗尽后一次同时获取的连接数
        ds.setAcquireIncrement(3);
        //每过多久检查连接池中空闲的连接,单位s
        ds.setIdleConnectionTestPeriod(5 * 60);
        //多久没有使用连接被丢弃，单位s
        ds.setMaxIdleTime(3 * 60);
        //当连接不够用的时候等待连接池中的连接数可用的超时时间，ms
        ds.setCheckoutTimeout(3000);
        //在获取数据库连接失败后重试的次数
        ds.setAcquireRetryAttempts(2);
        //每个连接可用的最大缓存数
        ds.setMaxStatementsPerConnection(100);
        ds.setMaxStatements(0);
        ds.setNumHelperThreads(5);

        //设置当关闭的时候自动提交
        ds.setAutoCommitOnClose(true);

        //for debug
        //		ds.setDebugUnreturnedConnectionStackTraces(true);
        //		ds.setUnreturnedConnectionTimeout(3 * 60 + 15);
        dataSource = ds;
    }

}
